﻿Public Class MyFileSystemAccessRule
    'Sécurité d'un dossier ou d'un fichier
    Public Identity As String
    Public SID As String
    Public FileSystemRights As Integer
    Public Deny As Boolean

    Public Sub New(ByVal oAccessRule As System.Security.AccessControl.FileSystemAccessRule)
        'Obtenir l'identité associée au droit d'accès
        Try
            Me.Identity = oAccessRule.IdentityReference.Value.ToString
            If oAccessRule.IdentityReference.GetType().ToString = "System.Security.Principal.NTAccount" Then
                'On a une identité reconnue par le système local et convertie en NTAccount
                'On veut quand même obtenir le SID correspondant
                Dim oSid As System.Security.Principal.SecurityIdentifier = CType(oAccessRule.IdentityReference.Translate(GetType(System.Security.Principal.SecurityIdentifier)), System.Security.Principal.SecurityIdentifier)
                Me.SID = oSid.Value
            Else
                'On a une identité non-reconnue sous la forme d'un SID
                Me.SID = oAccessRule.IdentityReference.Value
            End If
              'On copie les droits
            Me.FileSystemRights = oAccessRule.FileSystemRights
            'Droits basics seulement ?
            'C'est un Deny ?
            Me.Deny = (oAccessRule.AccessControlType = Security.AccessControl.AccessControlType.Deny)
        Catch Ex As Exception
        End Try
    End Sub

    Public ReadOnly Property Key() As String
        Get
            Return Me.Identity & " " & Me.Deny.ToString()
        End Get
    End Property

    Public Function StringRights(ByVal BasicRightsOnly As Boolean) As String
        'Conversion de la règle d'accès en chaine de caractères
        Dim sSymbole As String
        Dim sDroits As String = ""
        Dim iLast As Integer = -2
        For Each iValue As Integer In [Enum].GetValues(GetType(System.Security.AccessControl.FileSystemRights))
            'On utilise cette condition pour éviter les droits qui bizarrement se répetent dans l'énumération
            If iValue <> iLast Then
                'On traite les droits basic seulement ou les droits avancés ?
                If (BasicRightsOnly And Array.IndexOf(BasicRights, iValue) <> -1) Or (Not BasicRightsOnly) Then
                    'Préparation du symbole correspondant au droit
                    sSymbole = System.Enum.GetName(GetType(System.Security.AccessControl.FileSystemRights), iValue)
                    sSymbole = GetShortName(sSymbole)
                    'On signale les Deny
                    If Me.Deny Then
                        sSymbole = "!" & sSymbole
                    Else
                        'Un espace permet d'aligner les droits
                        sSymbole = " " & sSymbole
                    End If
                    'Ce droit est-il défini ?
                    If (Me.FileSystemRights And iValue) = iValue Then
                        'Oui, on ajoute le caractère
                        sDroits &= "<td>" & sSymbole & "</td>"
                        'sDroits = Commun.AppendString(sDroits, sSymbole, ",")
                    Else
                        'Non, on inscrit des blancs à la place
                        sDroits &= "<td>&nbsp;</td>"
                        'sDroits = Commun.AppendString(sDroits, New String(" ", sSymbole.Length), ",")
                    End If
                End If
                iLast = iValue
            End If
        Next 'Suivant
        Return sDroits
    End Function

    Public Function StringValue(ByVal BasicRightsOnly As Boolean) As String
        'Retourne l'identité et les droits associés
        Return "<tr class=""Style1""><td>" & Me.Identity & "</td>" & Me.StringRights(BasicRightsOnly) & "</tr>"
        'Return Me.Identity & ":" & Me.StringRights()
    End Function
End Class
